/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.flink.ml.feature.vectorassembler;

import org.apache.flink.ml.common.param.HasHandleInvalid;
import org.apache.flink.ml.common.param.HasInputCols;
import org.apache.flink.ml.common.param.HasOutputCol;
import org.apache.flink.ml.param.IntArrayParam;
import org.apache.flink.ml.param.Param;
import org.apache.flink.ml.param.ParamValidator;

/**
 * Params of {@link VectorAssembler}.
 *
 * @param <T> The class type of this instance.
 */
public interface VectorAssemblerParams<T>
        extends HasInputCols<T>, HasOutputCol<T>, HasHandleInvalid<T> {
    Param<Integer[]> INPUT_SIZES =
            new IntArrayParam(
                    "inputSizes",
                    "Sizes of the input elements to be assembled.",
                    null,
                    sizesValidator());

    default Integer[] getInputSizes() {
        return get(INPUT_SIZES);
    }

    default T setInputSizes(Integer... value) {
        return set(INPUT_SIZES, value);
    }

    // Checks the inputSizes parameter.
    static ParamValidator<Integer[]> sizesValidator() {
        return inputSizes -> {
            if (inputSizes == null) {
                return false;
            }
            for (Integer size : inputSizes) {
                if (size <= 0) {
                    return false;
                }
            }
            return inputSizes.length != 0;
        };
    }
}
